import BaseController from "../../base.js";
/**
 * 用户相关门户接口
 */
export default class extends BaseController {
    /**
     * 登录
     *
     * @param {string} account 账号
     * @param {string} password 密码
     * 
     * @returns {Promise} 包含满足条件的新闻列表的Promise对象
     * @example
     *
     * const loginInfo = await request.post("/api/portal/users/login", 
     * {params: {account : 123 , password : 123456}});
     * 返回对象包含以下属性：
     * {
     *   error:1000
	 * 	 msg:'用户名不正确'
     * }
    */
    async loginAction(){//登录验证
		//获取前端提交过来的用户名，并定义一个常量存储它
		if(think.isEmpty(this.post('account'))){
			return this.fail(1000,'请输入用户名');
		}
		const account = this.post('account');

		//获取前端提交过来的密码，并定义一个常量存储它
		if(think.isEmpty(this.post('password'))){
			return this.fail(1000,'请输入密码');
		}
		const password = this.post('password');

		//对用户名进行验证
		const user = await this.model('users').where({account:account}).find();
		if(think.isEmpty(user)){
			return this.fail(1000,'用户名不正确');
		}

		// 对密码进行验证
        if(password != user.password){
            return this.fail(1000,'用户密码错误');
        }

		//实例化一个tokenservice对象，来调用create()方法创建一个token
		const TokenService = this.service('token');
		const token = await TokenService.create({
			id:user.id
		});

		//判断token是否创建成功
		if(think.isEmpty(token)){
			return this.fail('用户登录失败');
		}

		//令牌创建成功，返回给客户端"uerInfo"和"token"给前端
		const userInfo = {
			id:user.id,
			account:user.account
		};

		return this.success({
			token:token,
			userInfo:userInfo
		});
	}

	/**
     * 注册
     *
     * @param {string} account 账号
     * @param {string} password 密码
     * 
     * @returns {Promise} 包含满足条件的新闻列表的Promise对象
     * @example
     *
     * const registerInfo = await request.post("/api/portal/users/register", 
     * {params: {account : 123 , password : 123456}});
     * 返回对象包含以下属性：
     * {
     *   error:1000
	 * 	 msg:注册成功
     * }
    */
   async registerAction(){
	    //获取前端提交过来的用户名，并定义一个常量存储它
		if(think.isEmpty(this.post('account'))){
			return this.fail(1000,'请输入用户名');
		}
		const account = this.post('account');

		//获取前端提交过来的密码，并定义一个常量存储它
		if(think.isEmpty(this.post('password'))){
			return this.fail(1000,'请输入密码');
		}
		const password = this.post('password');

		//对用户名进行验证
		const users = await this.model('users').where({account:account}).find();


		//如果用户名不存在
		if(think.isEmpty(users)){

			//定义变量储存当前时间
			let date = require("silly-datetime");
    		let now_date = date.format(new Date() , 'YYYY-MM-DD HH:mm:ss');

			//在用户表中新增用户数据
			let data = this.post();
			
			data['create_time'] = now_date;

			let result = await this.model("users").add(data);

			//新增成功返回注册成功，不成功返回注册失败
			if(result){
				return this.success('注册成功');
			}else{
				return this.fail(1000,'注册失败');
			}
		}else{
			//用户名已存在
			return this.fail(1000,'用户名已存在');
		}
   }

    /**
     * 修改密码
     *
     * @param {string} account 账号
	 * @param {string} oldPassword 旧密码
     * @param {string} newPassword 新密码
     * 
     * @returns {Promise} 
     * @example
     *
     * const userUpdateInfo = await request.post("/api/portal/users/update", 
     * {params: {account : 123 , oldPassword : 123456 , newPassword : 112233}});
     * 返回对象包含以下属性：
     * {
     *   error:1000
	 * 	 msg:修改成功
     * }
    */
   async updateAction(){
		//获取前端提交过来的用户名，并定义一个常量存储它
		if(think.isEmpty(this.post('account'))){
			return this.fail(1000,'请输入用户名');
		}
		const account = this.post('account');

		//获取前端提交过来的旧密码，并定义一个常量存储它
		if(think.isEmpty(this.post('oldPassword'))){
			return this.fail(1000,'请输入旧密码');
		}
		const oldPassword = this.post('oldPassword');

		//获取前端提交过来的新密码，并定义一个常量存储它
		if(think.isEmpty(this.post('newPassword'))){
			return this.fail(1000,'请输入新密码');
		}
		const newPassword = this.post('newPassword');

		//对用户名进行验证
		let user = await this.model('users').where({account:account}).find();
		if(think.isEmpty(user)){
			return this.fail(1000,'用户名不正确');
		}

		// 对密码进行验证
		if(oldPassword != user.password){
			return this.fail(1000,'用户旧密码错误');
		}else{
			let info = await this.model('users').where({account:account}).update({password:newPassword});
			if(!think.isEmpty(info)){
				return this.success('修改成功');
			}else{
				return this.fail(1000,'修改失败');
			}
		}
	}
}